// 记忆函数

const _ = require('lodash')

function getArea(r) {
    console.log('getArea',r) //多次调用只打印一次，说明该方法被缓存
    return Math.PI * r * r
}

// let getAreaWithMemory = _.memoize(getArea)
// console.log(getAreaWithMemory(8))
// console.log(getAreaWithMemory(8))
// console.log(getAreaWithMemory(8))
// console.log(getAreaWithMemory(8))

// 模拟memoize方法
// 创建一个对象， 将fun的参数作为对象的key， fun的执行结果作为对象的value
function memoize(fun) {
    let cache = {}
    return function(){
        let key = JSON.stringify(arguments) //arguments是伪数组， 且无法指定具体长度，所以将其解析后的string作为cache的key
        cache[key]  = cache[key] || fun.apply(fun, arguments) // 利用apply将fun的参数展开并且返回给fun
        return cache[key]
    }
}

let getAreaWithMemory = memoize(getArea)
console.log(getAreaWithMemory(3))
console.log(getAreaWithMemory(3))
console.log(getAreaWithMemory(3))
console.log(getAreaWithMemory(3))